package com.lyb.statement.impl;

import com.lyb.Utils;
import com.lyb.statement.ExecutableStatement;

import java.util.Map;

/**
 * "赋值"语句的处理类
 *
 * @author Mr.Alpaca potato
 * @version 1.4.0
 */
public class AssignStatement implements ExecutableStatement {
    /**
     * 表示该类负责处理的可执行语句字符串
     */
    private final static String STATEMENT = "=";

    public AssignStatement() {
    }

    /**
     * 格式判断，输入语句需满足格式"变量名=数值"
     *
     * @param row   当前语句行数
     * @param input 输入语句
     * @return 判断结果
     */
    @Override
    public boolean formatJudge(int row, String input) {
        /* 将语句按等号切分后判断 */
        String[] split = input.split(STATEMENT);
        /* 若等号两边有一边为空则格式错误 */
        if (split.length != 2) {
            Utils.log("[系统|编译器]: 第 " + row + " 行: \"" + input + "\" 语句格式错误");
            return false;
        }
        /* 若等号左边不是变量(字母开头)则错误 */
        if (!Character.isLowerCase(split[0].charAt(0)) && !Character.isUpperCase(split[0].charAt(0))) {
            Utils.log("[系统|编译器]: 第 " + row + " 行: 参数 \"" + split[0] + "\" 不是合法变量名");
            return false;
        }
        /* 若等号右边非数字则错误 */
        if (!Utils.isNumber(split[1])) {
            Utils.log("[系统|编译器]: 第 " + row + " 行: 参数 \"" + split[1] + "\" 不是数字");
            return false;
        }
        return true;
    }

    /**
     * 执行该可执行语句,将语句值(value)赋值给变量(key)
     * 将结果储存到Map中
     *
     * @param statement   输入语句
     * @param variableMap 储存各变量值
     */
    @Override
    public void execute(String statement, Map<String, Double> variableMap) {
        /* 将语句按等号切分,等号左边为变量,右边为值 */
        String[] split = statement.split(STATEMENT);
        variableMap.put(split[0], Double.parseDouble(split[1]));
    }

    /**
     * 获得该类负责处理的可执行语句字符串
     *
     * @return 可执行语句字符串
     */
    @Override
    public String getStatement() {
        return STATEMENT;
    }
}
